package com.atguigu.tingshu.album.service.impl;

import com.atguigu.tingshu.album.config.MinioConstantProperties;
import com.atguigu.tingshu.album.service.FileUploadService;
import io.minio.BucketExistsArgs;
import io.minio.MakeBucketArgs;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.util.UUID;

/**
 * FileUploadServiceImpl 上传管理接口
 *
 * @author Petrichor
 * @version 2023/12/21 09:42
 **/
@Service
public class FileUploadServiceImpl implements FileUploadService {


    /**
     * @description: 上传文件
     * @author Petrichor
     * @date 2023/12/21 12:52
     * @param file 文件上传流
     * @return minio 的url
     **/
    @Override
    @SneakyThrows           // 进行异常处理
    public String fileUpload(MultipartFile file, MinioConstantProperties minioConstantProperties) {
        //  1.声明一个url 地址
        String url = "";
        // 使用minio的java客户端完成文件数据的上传
        MinioClient minioClient = MinioClient.builder()
                .endpoint(minioConstantProperties.getEndpointUrl())
                .credentials(minioConstantProperties.getAccessKey() ,  minioConstantProperties.getSecreKey())
                .build();
        // 2.判断 [glsx] 桶是否存在。
        boolean found =
                minioClient.bucketExists(BucketExistsArgs.builder().bucket(minioConstantProperties.getBucketName()).build());
        if (!found) {
            // 如果不存在 创建叫"glsx"的桶
            minioClient.makeBucket(MakeBucketArgs.builder().bucket(minioConstantProperties.getBucketName()).build());
        }
        // 3. 进行文件上传
        // 3.1 返回客户端文件系统中的原始文件名
        String originalFilename = file.getOriginalFilename();
        // 3.2 生成uuid 唯一性 的 文件名 存放在 minio 拼接在原文件名上
        originalFilename = UUID.randomUUID().toString().replace("-", "")+originalFilename;
        PutObjectArgs putObjectArgs = PutObjectArgs.builder()
                .bucket(minioConstantProperties.getBucketName())
                .stream(file.getInputStream() , file.getSize() , -1)
                // 指定存储到minio服务端的文件的名称
                .object(originalFilename)
                .build() ;
        //4. 文件上传
        minioClient.putObject(putObjectArgs) ;

        //5. 拼接文件访问地址
        url = minioConstantProperties.getEndpointUrl()+"/"+ minioConstantProperties.getBucketName() +"/"+originalFilename;
        return url;
    }
}


